<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

    <script>
        /*
            &&: 一假则假
                只要有一个是false,结果就是false
            ||: 一真则真
                只要有一个是true,结果就是true

            那么换句话说,如果一个逻辑&&的运算式,左边都已经是false了,有必要看右边吗??
                没必要,所以右边代码并不会执行

            如果一个逻辑||的运算时,左边都已经是true了,有必要看右边吗?也没必要
                所以右边并不会执行

            记短路记法:
                && 找假,假短路
                || 找真,真短路
        */

        // false && alert('123') // 不会弹出,因为短路了
        // true && alert('456')  // 会弹出

        // false || alert('a') // 会弹出
        // true || alert('b') // 不弹出,因为短路了

        // let num = 10
        // false && ++num  // 短路了,右边不执行,所以num的值还是10
        // console.log(num) // 10


        // let num = 10
        // 空字符串, null, NaN, undefined, 0 只有这5种都会转成false,其他都是转成true
        // '' && ++num  // ''空字符串就是false,&&找假,它都已经是假了,所以短路,所以右边不执行
        // console.log(num) // 10

        // let num = 10
        // ' ' && ++num // 注意这里不是空字符串,是字符串里有空格,那么就是true,没有短路右边执行了
        // console.log(num)  // 11


        // let num = 10
        // let obj = {}
        // obj && ++num // 哪怕空对象也是true,所以没短路,右边执行了,那么num的结果是11
        // console.log(num)  // 11


        // 逻辑运算符也是运算,既然是运算,肯定有运算结果
        // 它的运算结果跟短路有关,
        // 如果没短路,整个式子结果是右边的结果
        // 如果短路了,整个式子结果是左边的结果

        // 因为10+2得到12,也就是真,真没有短路,所以式子结果是右边的结果
        // 右边的结果是5 * 3 就是15,所以整体得到15
        // let res1 = 10 + 2 && 5 * 3
        // console.log(res1) // 15

        // 以前的误区: 会以为逻辑运算符返回的一定是true或者false
        // 其实并不是!!它是看短不短路,短路就是左边运算结果,不短路就是右边运算结果
        // 逻辑运算符里 ! 才是得到true或者false

        // let res2 = 10 - 10 && 5 * 3 // 10-10得到0,0就是假,假短路,那么式子结果是左边结果
        // console.log(res2) // 0


        // let user = 'admin'
        // let pwd = '8888'

        // // 觉得以前返回的就是true和false,那是因为这里的不管左边还是右边
        // // 本身运算结果就是true和false
        // if ( user == 'admin' && pwd == '8888' ) {

        //     alert('登录成功')
        // }else {

        //     alert('登录失败')
        // }

        
        // || 找真,真就短路,整个式子结果就是左边结果
        // alert( 1||2 ) // 弹出什么?是弹出 1||2?还是弹出什么?弹出1

        // 写原生的事件的时候有个东西叫事件对象
        // 事件对象IE8不支持,所以如何兼容?(了解即可)
        // e = e || window.event


        // ! 会先把数据隐式转换成布尔类型,再取反,所以得到的结果一定是true或者false
        // console.log(!10) // 先把10隐式转换成布尔,就是true,再取反就得到false

        // 运算符:算术运算符,比较运算符,逻辑运算符,赋值运算符(=)

        // 赋值运算符,也是运算符,既然是运算符,肯定也有运算结果
        // 运算结果就是所赋予的值
        // let num1 = 10
        // console.log( num1 = num1 * 2) // 20

        // // 用处:昨天用过
        // this.name = this.price = ''
    
    </script>
</body>

</html>